/*
 * @param best_build        KBest索引
 * @param k_f               KBest构建参数：邻居节点数
 * @param efs               KBest搜索参数：候选节点列表大小
 * @param efc               KBest构建参数：候选节点列表大小
 * @param A                 KBest构建参数：构图剪枝时的角度阈值
 * @param graph_opt_iter    KBest构建参数：图优化迭代次数
 * @param metric            KBest构建参数：距离度量类型
 * @param init_builder_type KBest构建参数：构建k近邻图的算法
 * @param index_type        KBest构建参数：选择邻居策略
 * @param consecutive       KBest构建参数：块大小
 * @param reorder           KBest构建参数：是否开启底库向量重排
 * @param level             KBest构建参数：控制量化的等级
 * @param adding_pref       KBest搜索参数：超参候选集插入阈值
 * @param patience          KBest搜索参数：检索耐心值
 * @param NUMA_ENABLED      是否均衡NUMA
 * @param num_numa_nodes    NUMA数量
 * @param index_path        索引保存/加载路径
 * @param save_or_load      保存/加载
 */

#ifndef KBEST_INDEX_H
#define KBEST_INDEX_H

#include "index_base.h"
#include "datasets.h"
#include "config_parser.h"
#include <memory>
#include <string>
#include "kbest.h"

class KBest;

class KBestIndex : public IndexBase {
public:
    KBestIndex(const ConfigParser& config);

    virtual void build(const Datasets* data) override;
    virtual void prepare_search() override;
    virtual void search_single(const float* xq, int k, float* distances, int64_t* labels) override;
    virtual void search_batch(const int nq, const float* xq, int k, float* distances, int64_t* labels) override;
    virtual void search_batch(const int nq, const float* xq, int k, float* distances, int64_t* labels, int num_threads);

private:
    std::unique_ptr<KBest> best_build;
    int k_f;
    int efs;
    int efc;
    int A;
    int graph_opt_iter;
    std::string metric;
    std::string init_builder_type;
    std::string index_type;
    int consecutive;
    int reorder;
    int level;
    int adding_pref;
    int patience;
    bool NUMA_ENABLED;
    int num_numa_nodes;
    std::string index_path;
    std::string save_or_load;
};

#endif // KBEST_INDEX_H